using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Collections.Generic;
using System.Drawing;
public partial class _Default : System.Web.UI.Page
{
    
    Databank db = Databank.DatabankInstantie;
    String gebruiker;
    String[,] agenda;
    DateTime begin;
    DateTime einde;
    int lengte = 7;
    int hoogte = 24;
    int maxKleuren = 15;
    Color[,] c;
    Color[] keuzeKleur;
    Color white = Color.White;
    Color silver = Color.Silver;
    List<Vak> vakken;
    Boolean opleidingcoordinator;
    Boolean mentor;
    List<String> gebruikerMentor;
    List<Richting> richtingen;
    protected void Page_Load(object sender, EventArgs e)
    {
        SessionGebruiker sg = (SessionGebruiker)Session["login"];
        if (sg == null)
        {
            Server.Transfer("login.aspx");
        }
        else
        {
            gebruiker = sg.Gebruiker;
        }
        agenda = new String[hoogte, lengte];
        c = new Color[hoogte, lengte];
        vakken = new List<Vak>();
        ZoekRangeDateTime(DateTime.Today);
        keuzeKleur = new Color[maxKleuren];
        keuzeKleur[0] = Color.MediumSpringGreen;
        keuzeKleur[1] = Color.Orange;
        keuzeKleur[2] = Color.BlueViolet;
        keuzeKleur[3] = Color.Chocolate;
        keuzeKleur[4] = Color.Crimson;
        keuzeKleur[5] = Color.Maroon;
        keuzeKleur[6] = Color.BurlyWood;
        keuzeKleur[7] = Color.Firebrick;
        keuzeKleur[8] = Color.Gold;
        keuzeKleur[9] = Color.Teal;
        keuzeKleur[10] = Color.Indigo;
        keuzeKleur[11] = Color.Peru;
        keuzeKleur[12] = Color.Lime;
        keuzeKleur[13] = Color.LightSkyBlue;
        keuzeKleur[14] = Color.MediumOrchid;
        Calendar1.SelectionMode = CalendarSelectionMode.Day;
        
            opleidingcoordinator = false;
            List<String> rollen = db.GetRollenGebruiker(gebruiker);
            mentor = false;
            for (int i = 0; i < rollen.Count; i++)
            {
                if (rollen[i].Equals("opleidings coordinator"))
                {
                    opleidingcoordinator = true;
                }
                if (rollen[i].Equals("mentor"))
                {
                    mentor = true;
                }
            }
            if (!Page.IsPostBack)
            {
                RichtigingDropDownList.Visible = false;
                Label1.Visible = false;
                if (RichtigingDropDownList.Items.Count > 0)
                {
                    RichtigingDropDownList.Items.Clear();
                }
                if (opleidingcoordinator)
                {
                    richtingen = db.GetRichtingenOpleidingscoordinator(gebruiker);
                    if (richtingen.Count > 0)
                    {
                        RichtigingDropDownList.Items.Add(new ListItem("Eigen agenda", "Eigen agenda"));
                        RichtigingDropDownList.Visible = true;
                        Label1.Visible = true;
                        for (int y = 0; y < richtingen.Count; y++)
                        {
                            RichtigingDropDownList.Items.Add(new ListItem(richtingen[y].Naam, richtingen[y].Id.ToString()));
                        }
                    }
                }
                if (mentor)
                {
                    gebruikerMentor = db.GetMentorGebruikers(gebruiker);
                    RichtigingDropDownList.Visible = true;
                    Label1.Visible = true;
                    if (!opleidingcoordinator)
                    {
                        RichtigingDropDownList.Items.Add(new ListItem("Eigen agenda", "Eigen agenda"));
                    }


                    for (int y = 0; y < gebruikerMentor.Count; y++)
                    {
                        RichtigingDropDownList.Items.Add(new ListItem(gebruikerMentor[y], gebruikerMentor[y]));
                    }
                }
                vakken = GetVakkenGebruiker(gebruiker);
                VulKleurenVakken();
            }
            
    }
    private void VulKleurenVakken()
    {
        Double aantal = (Double)vakken.Count;
        Double result;
        int aantalItemsInKolomEen = 0;
        if (aantal != 0)
        {
            result = aantal / 2;
            Double temp = (double)((int)result-0.5);

            if (result > temp)
            {
                aantalItemsInKolomEen = (Int32)temp +1;
            }
            else
            {
                aantalItemsInKolomEen = (Int32)temp;
            }
        }
        for (int i = 0; i < (Int32)aantal; i++)
        {
            TableCell td = new TableCell();
            Label _label = new Label();
            td.BackColor = keuzeKleur[i];
            _label.Text = vakken[i].Naam;
            _label.ID = i.ToString() + "vak";
            td.Controls.Add(_label);
            
            if (i <= aantalItemsInKolomEen)
            {
                TableRow tr = new TableRow();
                tr.Cells.Add(td);
                kleurTable.Rows.Add(tr);
            }
            else
            {
                kleurTable.Rows[i-aantalItemsInKolomEen -1].Cells.Add(td);
            }
        }
    }
    private void ZoekRangeDateTime(DateTime r)
    {
        String dag = r.DayOfWeek.ToString();
        
        //Sunday Monday Tuesday Wednesday Thursday Friday Saturday 
        if (dag.Equals("Monday"))
        {
            begin = r;
            einde = r.AddDays(6);
        }
        if (dag.Equals("Tuesday"))
        {
            begin = r.Subtract(new TimeSpan(1,0,0,0));
            einde = r.AddDays(5);
        }
        if (dag.Equals("Wednesday"))
        {
            begin = r.Subtract(new TimeSpan(2, 0, 0, 0));
            einde = r.AddDays(4);
        }
        if (dag.Equals("Thursday"))
        {
            begin = r.Subtract(new TimeSpan(3, 0, 0, 0));
            einde = r.AddDays(3);
        }
        if (dag.Equals("Friday"))
        {
            begin = r.Subtract(new TimeSpan(4, 0, 0, 0));
            einde = r.AddDays(2);
        }
        if(dag.Equals("Saturday"))
        {
            begin = r.Subtract(new TimeSpan(5, 0, 0, 0));
            einde = r.AddDays(1);
        }
        if (dag.Equals("Sunday"))
        {
            begin = r.Subtract(new TimeSpan(6, 0, 0, 0));
            einde = r;
        }
    }
    protected void Calendar1_SelectionChanged(object sender, EventArgs e)
    {
            ZoekRangeDateTime(Calendar1.SelectedDate);
            if (RichtigingDropDownList.SelectedIndex == -1 )
            {
                // eigen agenda
                vakken = GetVakkenGebruiker(gebruiker);
                VulKleurenVakken();
                List<AgendaItem> ai = db.GetAgendaGebruiker(gebruiker, begin, einde.AddDays(1));
                rangeLabel.Text = "Agenda van week : " + begin.ToShortDateString() + " tot " + einde.ToShortDateString();
                ToonAgenda(ai);
                
            }
            else if (RichtigingDropDownList.SelectedIndex != 0 && !RichtigingDropDownList.SelectedItem.Value.Contains("@"))
            {
                //opleidingscoordinator controleerd richting
                int richting = int.Parse(RichtigingDropDownList.SelectedValue);
                vakken = GetVakkenRichting(richting);
                VulKleurenVakken();
                List<AgendaItem> ai = db.GetAgendaRichting(richting);
                rangeLabel.Text = "Agenda van week : " + begin.ToShortDateString() + " tot " + einde.ToShortDateString();
                ToonAgenda(ai);
            }
            else
            {
                //mentor controleerd gebruiker
                String gid = RichtigingDropDownList.SelectedItem.Value.ToString();
                vakken = GetVakkenGebruiker(gid);
                VulKleurenVakken();
                List<AgendaItem> ai = db.GetAgendaGebruiker(gid, begin, einde.AddDays(1));
                rangeLabel.Text = "Agenda van week : " + begin.ToShortDateString() + " tot " + einde.ToShortDateString();
                ToonAgenda(ai);
            }
    }
    private void ToonAgenda(List<AgendaItem> ai)
    {
        VulLeegAgenda();
        VulLeegKleuren();
        for (int i = 0; i < ai.Count; i++)
        {
            Insert(ai[i]);
        }
        
        for (int z = 0; z < hoogte; z++)
        {
            for (int y = 0; y < lengte; y++)
            {
                    TableCell td = new TableCell();
                    Label _label = new Label();
                    _label.Text = agenda[z, y];
                    _label.ID = z.ToString()+y.ToString();
                    td.BackColor = c[z, y];
                    td.Controls.Add(_label);
                    Table1.Rows[z].Cells.Add(td);
            }  
        }
        RemoveLegeRijen();
    }
    private void RemoveLegeRijen()
    {
        Int32 aantalLeeg = 0;
        Int32 aantalDeleted = 0;
        for (int z = 11; z < hoogte; z++)
        {
            for (int y = 0; y < lengte; y++)
            {
                if (agenda[z, y].Equals(""))
                {
                    aantalLeeg++;
                }
            }
            if (aantalLeeg == 7)
            {
                Table1.Rows.RemoveAt(z - aantalDeleted);
                aantalDeleted++;
            }
            aantalLeeg = 0;
        }
    }
    private void Insert(AgendaItem ai)
    {
        String dag = ai.Datum.DayOfWeek.ToString();
        TimeSpan test = new TimeSpan(0, ai.AantalMin, 0);
        int uur = test.Hours;
        int min = test.Minutes;
        String tijdString = ai.Datum.Hour.ToString() + ":" + ai.Datum.Minute+ "<br />";
        Vak v = db.GetVak(ai.VakId);
        int kolom=InsertInWelkeRij(ai.Datum);
        int rij = 0;
        if(uur != 0)
        {
            tijdString += uur.ToString() + "u ";
        }
        if(min !=0)
        {
            tijdString += min.ToString() + "m ";
        }
        if (dag.Equals("Monday"))
        {
            rij = 0;
        }
        if (dag.Equals("Tuesday"))
        {
            rij = 1;
        }
        if (dag.Equals("Wednesday"))
        {
            rij = 2;
        }
        if (dag.Equals("Thursday"))
        {
            rij = 3;
        }
        if (dag.Equals("Friday"))
        {
            rij = 4;
        }
        if (dag.Equals("Saturday"))
        {
            rij = 5;
        }
        if (dag.Equals("Sunday"))
        {
            rij = 6;
        }
        Int32 nr = -1;
        nr = Zoeken(vakken, v.Code);
        if (nr == -1)
        {
            String temp = v.Code.Replace("NC-", "");
            nr = Zoeken(vakken, temp);
        }
        if (nr == -1 || nr > 14)
        {
            c[kolom, rij] = white;
        }
        else
        {
            c[kolom, rij] = keuzeKleur[nr];
        }
        
        agenda[kolom, rij] += tijdString + v.Naam + "<br />";
    }
    private int InsertInWelkeRij(DateTime dt)
    {
        int uur = dt.Hour;
        int min = dt.Minute;
        int result = 0;
        switch (uur)
        {
            case 8:
                if (min >= 15)
                {
                    result = 1;
                }
                else
                {
                    result = 11;
                }
                break;
            case 9:
                if (min >= 15)
                {
                    result = 2;
                }
                else
                {
                    result = 1;
                }
                break;
            case 10:
                if (min >= 15)
                {
                    result = 3;
                }
                else
                {
                    result = 2;
                }
                break;
            case 11:
                if (min >= 15)
                {
                    result = 4;
                }
                else
                {
                    result = 3;
                }
                break;
            case 12:
                if (min >= 15)
                {
                    result = 5;
                }
                else
                {
                    result = 4;
                }
                break;
            case 13:
                if (min >= 15)
                {
                    result = 6;
                }
                else
                {
                    result = 5;
                }
                break;
            case 14:
                if (min >= 15)
                {
                    result = 7;
                }
                else
                {
                    result = 6;
                }
                break;
            case 15:
                if (min >= 15)
                {
                    result = 8;
                }
                else
                {
                    result = 7;
                }
                break;
            case 16:
                if (min >= 15)
                {
                    result = 9;
                }
                else
                {
                    result = 8;
                }
                break;
            case 17:
                if (min >= 15)
                {
                    result = 10;
                }
                else
                {
                    result = 9;
                }
                break;
            default:
                result = uur;
                break;
        }
        return result;
    }
    private void VulLeegAgenda()
    {
        for (int z = 0; z < hoogte; z++)
        {
            for (int y = 0; y < lengte; y++)
            {
                agenda[z, y] = "";
            }
        }
    }
    private void VulLeegKleuren()
    {
        for (int z = 0; z < hoogte; z++)
        {
            for (int y = 0; y < lengte; y++)
            {
                c[z,y] = white;
            }
        }
        for (int y = 0; y < lengte; y++)
        {
            c[5, y] = silver;
        }
        for (int i = 1; i < hoogte; i++)
        {
            for (int y = 6; y < lengte; y++)
            {
                c[i,y] = silver;
            }
        }
        for (int i = 11; i < hoogte; i++)
        {
            for (int y = 0; y < lengte; y++)
            {
                c[i, y] = silver;
            }
        }
    }
    private int Zoeken(List<Vak> vakken, String zoekVak)
    {
        int result = -1;
        for (int i = 0; i < vakken.Count; i++)
        {
            if (string.Equals(vakken[i].Code, zoekVak))
            {
                result = i;
            }
        }
        return result;
    }
    private List<Vak> GetVakkenGebruiker(string gid)
    {
        List<Richting> gebruikerRichtingen = db.GetGebruikerRichtingen(gid);
        List<Vak> vakkenResult = new List<Vak>();
        for (int i = 0; i < gebruikerRichtingen.Count; i++)
        {
            List<Vak> temp = db.GetVakkenRichting(gebruikerRichtingen[i].Id);
            for (int y = 0; y < temp.Count; y++)
            {
                String tempZoek = temp[y].Code.Replace("NC-", "");
                int test = Zoeken(vakkenResult, tempZoek);
                if (test == -1)
                {
                    vakkenResult.Add(temp[y]);
                }
            }
        }
        return vakkenResult;
    }
    private List<Vak> GetVakkenRichting(int richting)
    {
        List<Vak> temp = db.GetVakkenRichting(richting);
        List<Vak> vakkenResult = new List<Vak>();
        for (int y = 0; y < temp.Count; y++)
        {
            String tempZoek = temp[y].Code.Replace("NC-", "");
            int test = Zoeken(vakkenResult, tempZoek);
            if (test == -1 )
            {
                vakkenResult.Add(temp[y]);
            }
        }
        return vakkenResult;
    }
    protected void RichtigingDropDownList_SelectedIndexChanged1(object sender, EventArgs e)
    {

    }
}
